package org.xyl.service.embedding;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 简单的嵌入服务实现
 * 注：这是一个模拟实现，仅用于开发和测试环境
 * 在生产环境中应替换为真实的嵌入模型
 */
@Service
public class SimpleEmbeddingService {
    
    private static final Logger logger = LoggerFactory.getLogger(SimpleEmbeddingService.class);
    private static final int EMBEDDING_DIMENSION = 1536; // 与OpenAI的ada-002维度保持一致
    private final Random random = new Random();
    
    /**
     * 为文本生成嵌入向量
     * 在真实环境中，这里应该调用实际的嵌入模型API
     */
    public List<Double> embed(String text) {
        logger.debug("生成嵌入向量: {}", text.length() > 50 ? text.substring(0, 50) + "..." : text);
        
        // 简单实现：基于文本的哈希值生成伪随机向量
        // 这样相同的文本会生成相似的向量，不同的文本生成不同的向量
        long seed = text.hashCode();
        random.setSeed(seed);
        
        List<Double> embedding = new ArrayList<>(EMBEDDING_DIMENSION);
        for (int i = 0; i < EMBEDDING_DIMENSION; i++) {
            // 生成-1到1之间的随机数
            embedding.add(random.nextDouble() * 2 - 1);
        }
        
        return embedding;
    }
    
    /**
     * 批量生成嵌入向量
     */
    public List<List<Double>> embedBatch(List<String> texts) {
        List<List<Double>> embeddings = new ArrayList<>(texts.size());
        for (String text : texts) {
            embeddings.add(embed(text));
        }
        return embeddings;
    }
    
    /**
     * 获取嵌入维度
     */
    public int getEmbeddingDimension() {
        return EMBEDDING_DIMENSION;
    }
}